package conf

import (
	"fmt"
	"github.com/fsnotify/fsnotify"
	"github.com/spf13/viper"
	"os"
)

var Cfg = new(config)

type config struct {
	Server *ServerConfig `mapstructure:"server" json:"server"`
	Mysql  *MysqlConfig  `mapstructure:"mysql" json:"mysql"`
}

func InitConfig() {
	workDir, err := os.Getwd()
	if err != nil {
		panic(fmt.Errorf("读取应用目录失败:%s \n", err))
	}

	viper.SetConfigName("application")
	viper.SetConfigType("yml")
	viper.AddConfigPath(workDir + "/")
	// 读取配置信息
	err = viper.ReadInConfig()

	// 热更新配置
	viper.WatchConfig()
	viper.OnConfigChange(func(e fsnotify.Event) {
		// 将读取的配置信息保存至全局变量Conf
		if err := viper.Unmarshal(Cfg); err != nil {
			panic(fmt.Errorf("初始化配置文件失败:%s \n", err))
		}
	})

	if err != nil {
		panic(fmt.Errorf("读取配置文件失败:%s \n", err))
	}
	// 将读取的配置信息保存至全局变量Conf
	if err := viper.Unmarshal(Cfg); err != nil {
		panic(fmt.Errorf("初始化配置文件失败:%s \n", err))
	}
}

type ServerConfig struct {
	Mode     string `mapstructure:"mode" json:"mode"`
	Host     string `mapstructure:"host" json:"host"`
	Port     string `mapstructure:"port" json:"port"`
	InitData bool   `mapstructure:"init-data" json:"init-data"`
	Salt     string `mapstructure:"salt" json:"salt"`
	LogPath  string `mapstructure:"logpath" json:"logpath"`
}

type MysqlConfig struct {
	Username     string `mapstructure:"username" json:"username"`
	Password     string `mapstructure:"password" json:"password"`
	Database     string `mapstructure:"database" json:"database"`
	Host         string `mapstructure:"host" json:"host"`
	Port         int    `mapstructure:"port" json:"port"`
	Query        string `mapstructure:"query" json:"query"`
	LogMode      bool   `mapstructure:"log-mode" json:"logMode"`
	Charset      string `mapstructure:"charset" json:"charset"`
	Collation    string `mapstructure:"collation" json:"collation"`
	MaxOpenConns int    `mapstructure:"maxOpenConns" json:"maxOpenConns"`
	MaxIdleConns int    `mapstructure:"maxIdleConns" json:"maxIdleConns"`
}
